#include "tagkezelo.h"
#include <sstream>
#include <vector>


using namespace std;

void Tagkezelo::szulore(){
    akt = akt->szulo;

}
void Tagkezelo::gyerekre(const int &sorsz){
    if (dynamic_cast<TElem*> (akt) ){

        TElem *seged = dynamic_cast<TElem*> (akt);

        if (sorsz-1 < seged->gyerekek.size()){
            akt = seged->gyerekek[sorsz-1];
        }else throw NIGY;
    }else throw NGY;
}

void Tagkezelo::torles(){
    if (akt == xmldoc){
        throw DOC_ERASE;
    }else if(dynamic_cast<TDeklaracio*> (akt) ){
        throw DEK_ERASE;
    }else {
        Tag* t = akt;
        szulore();
        TElem *seged = dynamic_cast<TElem*> (akt);
        bool l =false;
        for(vector<Tag*>::iterator it = seged->gyerekek.begin();
        it != seged->gyerekek.end() && !l;++it){
            if (l=(*it == t)){ seged->gyerekek.erase(it);}
        }
        delete t;
    }
}

void Tagkezelo::ujelem(string sz,bool nyito){
    if (dynamic_cast<TElem*> (akt) ){
        TElem *seged = dynamic_cast<TElem*> (akt);
        istringstream is;
        string nev,ertek;

        is.str(sz); is >> nev;
        TElem *ujt = new TElem(nev,akt);

        while(!is.eof()){
            getline(is,nev,'"');
            if (!is.eof()){
                string::size_type k = 0;
                while((k=nev.find(' ',k))!=nev.npos) {
                    nev.erase(k, 1);
                }
                if ((k=nev.find('=',0))!=nev.npos) {
                    nev.erase(k,1);
                }else { throw MISS_EQ;}
                getline(is,ertek,'"');
                if (is.eof()){ throw MISS_CAT;
                }
                try{
                    ujt->ujatri(nev,ertek);
                }catch(TElem::Exceptions e){
                }
            }
        }
        seged->ujgyerek(*ujt);
        if(nyito){gyerekre(seged->gyerekek.size());}

    }else throw NGY;
}
void Tagkezelo::elemzaro(std::string sz){
    if (dynamic_cast<TElem*> (akt) ){
        if(akt->getname() == sz ){
            szulore();
        }else { throw WRONG_CLOSE;}
    }else{ throw NGY;}
}

void Tagkezelo::ujmeg(std::string sz){
    if (dynamic_cast<TElem*> (akt) ){
        TElem *seged = dynamic_cast<TElem*> (akt);
        TMegjegy *ujt = new TMegjegy(sz,akt);
        seged->ujgyerek(*ujt);
    }else throw NGY;
}

void Tagkezelo::ujszoveg(std::string sz){
    if (dynamic_cast<TElem*> (akt) ){
        TElem *seged = dynamic_cast<TElem*> (akt);
        TSzoveg *ujt = new TSzoveg(sz,akt);
        seged->ujgyerek(*ujt);
    }else throw NGY;
}

void Tagkezelo::ujdek(std::string sz){
    if (dynamic_cast<TElem*> (akt) ){
        TElem *seged = dynamic_cast<TElem*> (akt);


        istringstream is;
        string nev,ertek;
        is.str(sz); is >> nev;
        TDeklaracio *ujt = new TDeklaracio(akt,nev);

        while(!is.eof()){
            getline(is,nev,'"');
            if (!is.eof()){
                string::size_type k = 0;
                while((k=nev.find(' ',k))!=nev.npos) {
                    nev.erase(k, 1);
                }
                if ((k=nev.find('=',0))!=nev.npos) {
                    nev.erase(k,1);
                }else {throw MISS_EQ;}
                getline(is,ertek,'"');
                if (is.eof()){ throw MISS_CAT;}
                try{
                    ujt->ujatri(nev,ertek);
                }catch(TDeklaracio::Exceptions e){
                }
            }
        }
        seged->ujgyerek(*ujt);

    }else throw NGY;
}

string Tagkezelo::docstring(){
   ostringstream os;
   vector<Tag*> &seged = xmldoc->gyerekek;
   for(vector<Tag*>::iterator it = seged.begin();it != seged.end();++it){
        os << (*it)->toString() << endl;
    }
    return os.str();
}

void Tagkezelo::modnev(std::string nev){
    akt->modosit(nev);
}

void Tagkezelo::ujatri(string nev, string ertek){
    if (dynamic_cast<TElem*> (akt) ){
        TElem *seged = dynamic_cast<TElem*> (akt);
        seged->ujatri(nev, ertek);
    }else if(dynamic_cast<TDeklaracio*> (akt) ){
        TDeklaracio *seged = dynamic_cast<TDeklaracio*> (akt);
        seged->ujatri(nev, ertek);
    }
}

void Tagkezelo::torlesatri(string nev){
    if (dynamic_cast<TElem*> (akt) ){
        TElem *seged = dynamic_cast<TElem*> (akt);
        seged->torlesatri(nev);
    }else if(dynamic_cast<TDeklaracio*> (akt) ){
        TDeklaracio *seged = dynamic_cast<TDeklaracio*> (akt);
        seged->torlesatri(nev);
    }
}

void Tagkezelo::modatri(string nev, string ertek){
    if (dynamic_cast<TElem*> (akt) ){
        TElem *seged = dynamic_cast<TElem*> (akt);
        seged->modatri(nev,ertek);
    }else if(dynamic_cast<TDeklaracio*> (akt) ){
        TDeklaracio *seged = dynamic_cast<TDeklaracio*> (akt);
        seged->modatri(nev,ertek);
    }
}

bool Tagkezelo::hasatri(){
    bool l = (dynamic_cast<TElem*> (akt) || dynamic_cast<TDeklaracio*> (akt) );
    return l;
}

string Tagkezelo::aktualis(){
    return akt->konzolrair();
}
